package com.wgy.day29多线程.线程状态之等待唤醒状态;

/**
 * Created by pc on 2020/11/28 0:07
 * Description: LearningJava
 */
/*
等待唤醒案例(线程之间的通信): 通过同一个锁对象实现
创建一个顾客线程:告知老板要的包子的种类和数量,调用wait方法,放弃CPU执行,进入到WAITING状态(无限等待)
创建一个老板线程:花了5秒钟做好包子,做好之后,调用notify方法,唤醒顾客吃包子

注意:
     顾客和老板线程必须使用同步代码块包装起来,包裹等待和唤醒只有一个在执行
     同步使用的锁对象必须保证唯一
     只要锁对象才能调用wait和notify方法

Object类中的方法:void wait():在其他线程调用此对象的notify()方法或者notifyAll()方法前,导致当前线程等待
               void notify():唤醒此对象监视器上等待的单个线程

*/
public class Demo01WaitAndNotify {
    public static void main(String[] args) {
        //创建锁对象,保证唯一
        Object obj = new Object();
        //创建顾客线程
        new Thread() {
            @Override
            public void run() {
                //一直等待买包子
                while (true) {
                    synchronized (obj) {
                        System.out.println("告知老板要的包子的种类和数量");
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //唤醒之后执行的代码
                    System.out.println("包子好香,开吃!");
                    System.out.println("===============");
                }
            }
        }.start();



        //创建老板线程
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    //花了5秒做包子
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //保证等待和唤醒的线程只能有一个执行,需要使用同步技术
                    synchronized (obj) {
                        System.out.println("老板5秒后做好包子了,告知顾客,可以吃包子了");
                        obj.notify();
                    }
                }

            }

        }.start();


    }
}
